package com.bkhech.home.practice.hutool;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.Tailer;
import cn.hutool.core.io.watch.SimpleWatcher;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.lang.Console;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.WatchEvent;

/**
 * 文件监听
 * <p>
 * WatchMonitor提供的事件有：
 * <p>
 * ENTRY_MODIFY 文件修改的事件
 * ENTRY_CREATE 文件或目录创建的事件
 * ENTRY_DELETE 文件或目录删除的事件
 * OVERFLOW 丢失的事件
 * <p>
 * 这些事件对应StandardWatchEventKinds中的事件。
 *
 * 注意：相对路径不好使
 *
 * @author guowm
 * @date 2023/1/29
 */
public class FileDemo {
    public static void main(String[] args) {
        // 相对路径不好使
//         File file = FileUtil.file("example.properties");

        String path = System.getProperty("user.dir") +
                "\\java-base\\src\\main\\java\\com\\bkhech\\home\\practice\\hutool\\" +
                "example.properties";
        File file = FileUtil.file(path);

//        watchMonitor(file);
        tailer(file);
    }

    private static void tailer(File file) {
        Tailer tailer = new Tailer(file, Tailer.CONSOLE_HANDLER, 2);
        tailer.start();
    }

    private static void watchMonitor(File file) {
        WatchMonitor.createAll(file, new SimpleWatcher(){
            @Override
            public void onCreate(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("创建：{}-> {}", currentPath, obj);
                System.out.println("onCreate");
            }

            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("修改：{}-> {}", currentPath, obj);
                System.out.println("onModify");
            }

            @Override
            public void onDelete(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("删除：{}-> {}", currentPath, obj);
                System.out.println("onDelete");
            }

            @Override
            public void onOverflow(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("Overflow：{}-> {}", currentPath, obj);
                System.out.println("onOverflow");
            }
        }).start();
    }
}
